package org.wheel.plugins.starter.autoconfigure;

import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.wheel.plugins.toolkit.jdbc.pool.util.DynamicJdbcPoolUtil;

import javax.sql.DataSource;

/**
 * 官方数据源已存在时：把主数据源 + 多数据源同名 Bean 全部吸收进 DynamicJdbcPoolUtil
 * 优先级最高，保证比 DynamicDataSourceAutoConfiguration 先跑
 */
@Slf4j
@Configuration
@AutoConfigureAfter(DataSourceAutoConfiguration.class) // 等官方建完再跑
//@EnableConfigurationProperties(DynamicDataSourceProperties.class) // ← 补这一行
public class OfficialDataSourceReuseConfiguration {

    @Bean
    public OfficialDataSourceAbsorber officialDataSourceAbsorber(
            ObjectProvider<DataSource> dataSourceProvider,
            DynamicDataSourceProperties properties,
            DynamicJdbcPoolUtil util) {
        log.info("[OfficialDataSourceReuseConfiguration] 官方数据源已存在时：把主数据源 + 多数据源同名 Bean 吸收进 DynamicJdbcPoolUtil");
        // 1. 给主数据源补默认名
        if (StrUtil.isBlank(properties.getName()) && StrUtil.isNotBlank(properties.getUrl())) {
            properties.setName(properties.getDefaultName());
        }
        // 2. 给多数据源补默认名
        if (MapUtil.isNotEmpty(properties.getMultiDatasource())) {
            properties.getMultiDatasource().forEach((key, conn) -> {
                if (StrUtil.isBlank(conn.getName())) {
                    conn.setName(key);
                }
            });
        }

        DataSource ds = dataSourceProvider.getIfAvailable();
        return new OfficialDataSourceAbsorber(ds, properties, util);
    }


    @Bean
    public DynamicJdbcPoolUtil dynamicJdbcPoolUtil() {
        return DynamicJdbcPoolUtil.getInstance();
    }
}